package dr.joueurs;

import java.util.LinkedList;

import dr.moteur.BaseAbstraite;
import dr.moteur.GameEngine;

public class Brain  extends Thread{
	
	GameEngine ge;
	private int idPlayer;
	private int or; 

	//int idPlayer;
	
	public Brain(GameEngine ge, int id){
		this.ge = ge;
		this.idPlayer = id;
	}
	
	public void  updateOr(int or) {
		this.or = or; 
	}
	
	public String decision(int idPlayer, int or ){
		LinkedList<BaseAbstraite> liste = ge.getListeBases(); //acces a la liste globale des bases
		LinkedList<BaseAbstraite> listeJoueur = new LinkedList<BaseAbstraite>(); //creation d'une liste des tours qui appartiennent au joueur
		LinkedList<BaseAbstraite> listeObjectifs = new LinkedList<BaseAbstraite>(); //creation d'une liste des tours � conqu�rir
		for (int i=0; i<liste.size(); i++){//parcours de la liste globale pour trier les bases dans les 2 nouvelles listes
			int idJ = liste.get(i).getIdJoueur();
			if (idJ==idPlayer){
				listeJoueur.addLast(liste.get(i));
			}
			else {
				listeObjectifs.addLast(liste.get(i));
			}
		}
		for (int i=0; i<listeJoueur.size(); i++){//parcours de la liste des bases du joueur
			
			/*calcul de la base ennemie la plus proche pour la choisir comme destination de chaque base du joueur*/
			
			float dMin = (float) 1000.0;
			int cible = 0; //pour garder en memoire l'id de la base � viser
			for (int j=0; j<listeObjectifs.size(); j++){//parcours de la liste des bases ennemies a proximite de la base i
				float x1 = ge.graphe.graphe.get(listeJoueur.get(i).getIndiceNoeudLocation()).x;
				float y1 = ge.graphe.graphe.get(listeJoueur.get(i).getIndiceNoeudLocation()).y;
				float x2 = ge.graphe.graphe.get(listeJoueur.get(j).getIndiceNoeudLocation()).x;
				float y2 = ge.graphe.graphe.get(listeJoueur.get(j).getIndiceNoeudLocation()).y;
				float dist = (float) Math.pow((Math.pow(x1-x2,2)+Math.pow(y1-y2,2)),0.5); //calcul de la dist entre les 2 bases avec les coordonnees
				if (dist<dMin){ //si la distance trouvee est inferieure aux precedentes, on la stocke
					dMin=dist;
					cible=j;
				}
			}
			if (listeJoueur.get(i).getCible().getIndice()!=cible){ //si la base i n'a pas deja pour cible la base ennemie la plus proche, le joueur la choisit
				return String.valueOf(idPlayer)+" setDestination "+String.valueOf(i)+" "+String.valueOf(cible);
			}
		}
		
		/*si le joueur a deja mis pour cible de chacune de ses bases la base ennemie la plus proche, 
		 * il construit une tour pour proteger la base qui a le moins d'agents a l'interieur*/
		
		//calcul de la base qui a le plus petit nb d'agents dedans
		int nbMax = 1000;
		int idBase = 0;
		for (int i=0; i<listeJoueur.size(); i++){
			int nbAgents = listeJoueur.get(i).getVie();
			if (nbAgents<nbMax){
				nbMax = nbAgents;
				idBase = i;
			}
		}
		//choix de la position de la tour
		int X = 45;
		int Y = 46;
		
		//construction d'une tour, plus il a d'argent, plus il l'utilise !
		if (or>=800){
			return String.valueOf(idPlayer)+" creeTour TourSuperLeurre "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
			//"numdujoueur creeTour numbase typetour positionX positionY"
		}
		else if (or>=450){
			return String.valueOf(idPlayer)+" creeTour TourFournaise "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=400){
			return String.valueOf(idPlayer)+" creeTour TourBarrage "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=350){
			return String.valueOf(idPlayer)+" creeTour TourAdrenaline "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=323){
			return String.valueOf(idPlayer)+" creeTour TourMedicale "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=300){
			return String.valueOf(idPlayer)+" creeTour TourGlace "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=275){
			return String.valueOf(idPlayer)+" creeTour TourSniper "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=250){
			return String.valueOf(idPlayer)+" creeTour TourAcide "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=200){
			return String.valueOf(idPlayer)+" creeTour TourCanon "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		else if (or>=150){
			return String.valueOf(idPlayer)+" creeTour TourLaser "+String.valueOf(idBase)+" "+String.valueOf(X)+" "+String.valueOf(Y);
		}
		return "rien a faire ici";
	}

	public String creationTour(int numBase){
		return "ici";
	}
	
	public String choixDestinationBase(int idPlayer){
		String baseDeBase,baseDeDest;
		baseDeBase = String.valueOf(Math.round(Math.random()*3));//Ici 3 et 12 sont a changer en fonction
		baseDeDest = String.valueOf(Math.round(Math.random()*12));// du nombre de bases du joueur IA et en fonction du nombre total de bases
		return String.valueOf(idPlayer)+" setDestination "+baseDeBase+" "+baseDeDest;
	}
	
	public void run(){
		boolean machin=true;
		String instruction;
		double choix;
		
		
		while(machin == true){
			
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				System.out.println("Sleep error");
			}
			
			//choix = Math.random()*10;
			
			//if(choix < 5 ) instruction = creationTour(0);
			//else instruction= choixDestinationBase();
													// String "0 setDestination 3 4"
													//   "numdujoueur setDestination numbasedebase numbasedest"
													// String "0 creeTour 3 feu 45 56"
													//  "numdujoueur creeTour numbase typetour positionX positionY"
													// String "0 upgTour 10"
													//  "numdujoueur upgTour idTour"
													// String "0 choixProd 4 lourd
													//  "numdujoueur choixProd numbase typeprod"
			
			instruction=decision(idPlayer,or);
			//System.out.println(instruction);
			ge.receive(instruction);
		}
	}
	
    public static void main(String[] args) {
    }
}
